7.6 分组后的聚合处理
1、常规聚合处理
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")
print (df)
dict={}
for t,d in df.groupby(df.公司):
dict[t]=d.iloc[:,2:].sum()
df1=pd.DataFrame(dict).T.reset_index().rename(columns={ "index" : "公司" })
#.T为列转行;
# reset_index()为加索引名为“index";
# .rename(columns={"index":"公司"});是高尔夫索引名”index“改为”公司“
print (df1)
返回:
公司 | 业务员 | A | B | C | |
---|---|---|---|---|---|
0 | 成都分公司 | 张三 | 2454 | 2354 | 8486 |
1 | 成都分公司 | 李四 | 7196 | 7235 | 3043 |
2 | 成都分公司 | 许麻子 | 6984 | 7154 | 6046 |
3 | 上海分公司 | 郭流子 | 8294 | 6364 | 3607 |
4 | 上海分公司 | 杨老六 | 1636 | 1485 | 7564 |
5 | 北京分公司 | 王麻子 | 1217 | 9492 | 193 |
6 | 北京分公司 | 潘九 | 2100 | 4459 | 2011 |
公司 | A | B | C | |
---|---|---|---|---|
0 | 上海分公司 | 9930 | 7849 | 11171 |
1 | 北京分公司 | 3317 | 13951 | 2204 |
2 | 成都分公司 | 16634 | 16743 | 17575 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")
df1=df.groupby( "公司" ).sum().reset_index()
df2=df.groupby( "公司" ).max().reset_index()
print (df1)
print (df2)
返回:
公司 | 业务员 | A | B | C | |
---|---|---|---|---|---|
0 | 上海分公司 | 郭流子杨老六 | 3776 | 6914 | 7322 |
1 | 北京分公司 | 王麻子潘九 | 10535 | 8675 | 12048 |
2 | 成都分公司 | 张三李四许麻子 | 14613 | 13235 | 9686 |
公司 | 业务员 | A | B | C | |
---|---|---|---|---|---|
0 | 上海分公司 | 郭流子 | 3134 | 4399 | 5773 |
1 | 北京分公司 | 王麻子 | 5393 | 6474 | 7911 |
2 | 成都分公司 | 许麻子 | 8816 | 9217 | 6316 |
2、agg()函数
直接对分组对象使用聚合函数虽然操作简单,但它对所有列都执行聚合处理,很多时候,用户希望自己定义聚合的列,聚合方式也不需要统一,那么可以使用agg()函数,结构如下:
agg(func,*args,**kwargs)
func :指定聚合方式,可以是函数,字符串函数、列表、字典
*args :要传递给func的位置参数
**kwargs :要传递给func的关键参数
将agg()函数与聚合函数结合,能将分组对象的聚合能力最大化。
1、 所有列执行多种聚合方式-列表形式
对分组对象的所有列执行多种聚合方式
2、 不同列设置不同聚合方式-字典形式
其实在对分组做聚合时,大多数不会对所有列执行同一种聚合方式,更多是指定列做指定的聚合方式。
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")
df1=df.groupby("公司").agg([ "sum","max"]) #maen会报错
df2=df.groupby("公司").agg(
{ "A" : "sum" ,
"B" : "max" ,
"C" :[ "max","min" ]
}
)
print (df1)
print (df2)
返回:
业务员 | A | B | C | |||||
---|---|---|---|---|---|---|---|---|
sum | max | sum | max | sum | max | sum | max | |
公司 | ||||||||
上海分公司 | 郭流子杨老六 | 郭流子 | 3776 | 3134 | 6914 | 4399 | 7322 | 5773 |
北京分公司 | 王麻子潘九 | 王麻子 | 10535 | 5393 | 8675 | 6474 | 12048 | 7911 |
成都分公司 | 张三李四许麻子 | 许麻子 | 14613 | 8816 | 13235 | 9217 | 9686 | 6316 |
A | B | C | ||
---|---|---|---|---|
sum | max | max | min | |
公司 | ||||
上海分公司 | 3776 | 4399 | 5773 | 1549 |
北京分公司 | 10535 | 6474 | 7911 | 4137 |
成都分公司 | 14613 | 9217 | 6316 | 1415 |
3、聚合处理
前面学习了agg()函数的func参数中使用列表、字典的聚合方式,但不能修改聚合后的列名,可以设置使命名聚合
命名聚合是在命名时,可能有些字符是无效的,也就是无法命名成功,则可以换一种方式,就是以构建字典并解压缩关键字参数的方式完成。
前学agg()函数与聚合函数是配合使用是内置的,其实也可以自定义。
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")
df1=df.groupby( "公司" ).agg(
A求和=( "A","sum"),
B求最大=( "B", "sum")
).reset_index()
print (df1)
返回:
公司 | A求和 | B求最大 | |
---|---|---|---|
0 | 上海分公司 | 3776 | 6914 |
1 | 北京分公司 | 10535 | 8675 |
2 | 成都分公司 | 14613 | 13235 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx" )
df1=df.groupby("公司").agg(
**{ "2022年A求和" :( "A","sum" ), #加**是以构建字典并解压缩关键字参数的方式完成
"2022年B求最大" :( "B", "sum" )} #以数字开头的索引名需以字典的形式
).reset_index()
print (df1)
返回:
公司 | 2022年A求和 | 2022年B求最大 | |
---|---|---|---|
0 | 上海分公司 | 3776 | 6914 |
1 | 北京分公司 | 10535 | 8675 |
2 | 成都分公司 | 14613 | 13235 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")
df1=df.groupby("公司").agg(
名单=( "业务员",lambda s:s.str.cat(sep=","))
).reset_index()
print (df1)
返回:
公司 | 名单 | |
---|---|---|
0 | 上海分公司 | 郭流子,杨老六 |
1 | 北京分公司 | 王麻子,潘九 |
2 | 成都分公司 | 张三,李四,许麻子 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")
df1=df.groupby("公司").agg(
名单=( "业务员"lambda s: "," .join(s))
).reset_index()
print (df1)
返回:
公司 | 名单 | |
---|---|---|
0 | 上海分公司 | 郭流子,杨老六 |
1 | 北京分公司 | 王麻子,潘九 |
2 | 成都分公司 | 张三,李四,许麻子 |